using Autofac;
using Autofac.Extensions.DependencyInjection;
using PowerManage.API.Extensions;

var builder = WebApplication.CreateBuilder(args);

// ASP.NET Core 应用程序的启动过程分为两个主要阶段：
// 服务注册阶段（builder）：配置依赖注入容器，注册服务
// 中间件管道配置阶段（app）：配置HTTP请求处理管道

// 重构原则：
// 1、一个功能模块，对应一个扩展方法类；
// 2、扩展方法命名格式：AddPowerManage+功能名，区分框架默认的中间件服务。

//加服务添加到容器中
builder.AddPowerManageControllers();

// Swagger/OpenAPI服务
builder.AddPowerManageSwaggerGen();

//数据库上下文注入
builder.AddPowerManageDbContext();

//JWT相关
builder.AddPowerManageJwt();

//Service注入
builder.AddPowerManageService();

//Autofac注入
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureContainer<ContainerBuilder>(containerBuilder =>
    {
        containerBuilder.RegisterModule<AutofacModuleRegister>();
    });

//   日志级别  .Net提供了7个日志级别：
// Trace：0，包含最详细的消息。 这些消息可能包含敏感的应用数据。
// Debug：1，用于调试和开发。
// Information：2，一般用于跟踪系统的日志。
// Warning：3，一般用于记录异常事件或意外事件。
// Error：4，一般用于记录无法处理的异常。
// Critical：5，需要马上处理的失败，比如数据丢失、磁盘控件不足。
// None：6，关闭日志打印。
//开启日志 eventLog 仅在 'windows' 上受支持
// builder.Logging.AddConsole().AddEventLog();

//log4net日志配置
builder.Logging.AddLog4Net();
//AutoMapper依赖注入 手动注入 更加灵活，可以进行更细粒度的控制 公司项目为自动注入
builder.AddPowerManageAutoMapper();

//启用缓存
builder.Services.AddMemoryCache();

//跨域配置  配置 CORS（跨源资源共享）策略
var pMAllowSpecificOrigins = "PMAllowSpecificOrigins";
builder.AddPowerManageCorsOrigins(pMAllowSpecificOrigins);

//UnitOfWork注入
builder.AddPowerManageUnitOfWork();

//速率限制注入
builder.AddPowerManageRateLimiter();

var app = builder.Build();

//跨域配置
app.UseCors(pMAllowSpecificOrigins);

// 配置HTTP请求管道
if (app.Environment.IsDevelopment())
{
    //开发环境下，才开启Swagger
    app.UseSwagger();
    app.UseSwaggerUI();
}

//内联lambda写法： 允许body重用  context.Request.Body
app.Use(async (context, next) =>
{
    context.Request.EnableBuffering();
    await next();
});

app.UseHttpsRedirection();

//速率限制 在身份认证之前执行
app.UseRateLimiter();

app.UseAuthorization();

app.MapControllers();

app.Run();